<?php
/**
 * Session
 *
 * Classe criada para manuziar toda a sessao do Dracosys
 */
class Session implements ISession {

    /**
     * @var Session
     * Todos os dados armazenados em sessao
     */
    private $Session;

    public function __construct() {
        $this->Session = array();
    }
    /**
     * @static  init
     *
     * Metodos chamado para iniciar uma nova sessao no dracosys.
     *
     * @since   2011-12-31
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  void
     */
    public static function init() {
        unset($_SESSION['TSession']);
        Dracosys::$tSession = new Session();
        $_SESSION['TSession'] = serialize(Dracosys::$tSession);
    }

    /**
     * @method  setValue
     *
     * Insere um valor na sessao.
     *
     * @param   String  $StPackage  Pacote (Categoria) do que sera inserido
     * @param   String  $StIndex    Indice do que sera inserido
     * @param   Mixed   $MxValue    Conteudo que sera posto na sessao
     *
     * @since   2011-12-31
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  void
     */
    public function setValue($StPackage, $StIndex, $MxValue) {
        $this->Session[$StPackage][$StIndex] = $MxValue;
//        $this->commit();
    }
    /**
     * @method  getValue
     *
     * Recupera um valor da sessao
     *
     * @param   String  $StPackage  Pacote (Categoria) do que sera recuperado
     * @param   String  $StType     Tipo do pacote que sera recuperado
     * @param   String  $StIndex    Indice do valor a ser recuperado
     *
     * @since   2011-12-31
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  mixed
     */
    public function getValue($StPackage = false, $StType = false, $StIndex = false) {
        if( $StType ) {
            if( !$StIndex ) {
                return !empty($this->Session[$StPackage][$StType]) ? $this->Session[$StPackage][$StType] : false;
            } else {
                return !empty($this->Session[$StPackage][$StType][$StIndex]) ? $this->Session[$StPackage][$StType][$StIndex] : false;
            }
        } else {
            if( !$StPackage ) {
                return $this->Session;
            } else {
                return !empty($this->Session[$StPackage]) ? $this->Session[$StPackage] : false;
            }
        }
    }
    /**
     * @method  clean
     *
     * Limpa um valor da sessao
     *
     * @param   String  $StPackage      Pacote que sera excluido
     * @param   String  $StType         Tipo do pacote que sera ecluido
     * @param   String  $StIndex        Indice do tipo do pacote que sera excluido
     *
     * @since   2011-12-31
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  void
     */
    public function clean($StPackage = false, $StType = false, $StIndex = false) {
        if( $StType && $StIndex ) {
            unset($this->Session[$StPackage][$StType][$StIndex]);
        } else if( !$StIndex && $StType ) {
            unset($this->Session[$StPackage][$StType]);
        } else if( $StPackage && !$StType ) {
            unset($this->Session[$StPackage]);
        } else {
            unset($this->Session);
        }
//        $this->commit();
    }
    /**
     * @method  commit
     *
     * Commita a mudanca realizada na sessao. Serializa e envia para sessao
     *
     * @since   2011-12-31
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @return  void
     */
    public function commit() {
        $_SESSION['TSession'] = serialize($this);
    }

}

?>
